<?php
/**
 * Fluxo de Promoção (Mudança de Cargo)
 * @author bruno
 * @since 04/05/2010
 */
class FluxoPromocao extends BaseFluxoEncaminhamentos implements InterfaceFluxo
{
    /**
     * solicita a promoção de um funcionário
     * @param CandidatoVaga $candidatoVaga
     * @param $vagaid
     * @param $parecer
     * @return void
     */
    public static function solicitar(CandidatoVaga $candidatoVaga, $vagaid, $parecer)
    {
        self::isAuthorized('solicitar', $candidatoVaga, TRUE);
        
        try {
        	pg_query(conexao::Conectar(), 'begin');
        	
    		// Inserir Status
            $candidatoVaga->inserirHistorico(Status::Candidato_PromocaoSolicitada, $parecer);
            
            // Registrar a Movimentação
    	 	$candidatoVaga->registrarMovimentacao($vagaid);
    	 	
    	 	// Ativar Vaga
    	 	$vaga = new Vaga($vagaid);
    	 	$vaga->ativa = TRUE;
    	 	$vaga->statusid = Status::Vaga_AContratar;
    	 	$vaga->salvar();
    		
    		pg_query(conexao::Conectar(), 'commit');
    	}
    	catch (Exception $e) {
    	    pg_query(conexao::Conectar(), 'rollback');
    	    throw new Exception($e->getMessage());
    	}
    }
    
    public static function cancelar(CandidatoVaga $candidatoVaga, $parecer)
    {
        
        self::isAuthorized('cancelar', $candidatoVaga, TRUE);
        
        try {
            pg_query(conexao::Conectar(), 'begin');
            
            // candidatovaga inserir status
            $candidatoVaga->inserirHistorico(
                Status::Candidato_ContratacaoFinalizada,
                $parecer
            );
            
            $movimentacao = $candidatoVaga->getMovitacoesCandidatoVagaOrigem();
            
            // vaga destino
            $vaga = $movimentacao->getVagaDestino();
            
            $vaga->ativa = FALSE;
            $vaga->statusid = Status::Vaga_AContratar;
            $vaga->salvar();
            
            pg_query(conexao::Conectar(), 'commit');
        } catch (Exception $e) {
            pg_query(conexao::Conectar(), 'rollback');
            throw new Exception($e->getMessage());
        }
    }
    
    /**
     * encaminha a promoção de um funcionário
     * @param CandidatoVaga $candidatoVaga
     * @param $parecer
     */
    public static function encaminhar(CandidatoVaga $candidatoVaga, $parecer)
    {
        self::isAuthorized('encaminhar', $candidatoVaga, TRUE);
        $candidatoVaga->inserirHistorico(Status::Candidato_PromocaoEncaminhada, $parecer);
    }
    
    /**
     * Confirma a promoção de um funcionário
     * @param CandidatoVaga $candidatoVaga
     * @return integer
     */
    public static function confirmar(CandidatoVaga $candidatoVaga)
    {
        self::isAuthorized('confirmar', $candidatoVaga, TRUE);
        
        try {
            pg_query(conexao::Conectar(), 'begin');
            
            // Gravando historico na vaga atual do candidato (Promoção confirmada)
	 		$candidatoVaga->inserirHistorico(Status::Candidato_PromocaoConfirmada);
    	 	
    	 	// Desativando o relacionamento do candidato com a vaga atual
    	 	$candidatoVaga->ativo = FALSE;
    	 	$candidatoVaga->salvar();
    	 	
    	 	// A vaga atual é resetada: A contratar
    	 	$vaga = new Vaga($candidatoVaga->vagaid);
    	 	$vaga->resetarVaga();	
        	 	
    	 	// Movimentação
    	 	$movimentacao = $candidatoVaga->getMovitacoesCandidatoVagaOrigem();
            $vagaDestino = $movimentacao->getVagaDestino();
    	 	
    	 	// Inserindo relacionamento entre o candidato e a nova vaga
    	 	$novoCandidatoVaga = new CandidatoVaga();
    	 	$novoCandidatoVaga->ativo                = TRUE;
    	 	$novoCandidatoVaga->candidatoid          = $candidatoVaga->candidatoid;
    	 	$novoCandidatoVaga->admissao             = $candidatoVaga->admissao;
    	 	$novoCandidatoVaga->adminissaosugestao   = $candidatoVaga->adminissaosugestao;
            $novoCandidatoVaga->registroterceirizada = $candidatoVaga->registroterceirizada;
            $novoCandidatoVaga->vagaid               = $vagaDestino->vagaid;
            $novoCandidatoVaga->salvar();
    	 	
    	 	// Gravar em Movimentação
	 		$movimentacao->candidatovagaiddestino = $novoCandidatoVaga->getTableKeyValue();
	 		$movimentacao->salvar();  	 		
	 		
	 		// Gravando status no candidato: Candidato Contratado
	 		$novoCandidatoVaga->inserirHistorico(Status::Candidato_Promovido, NULL);
	 		$novoCandidatoVaga->inserirHistorico(Status::Candidato_Contratado, NULL, 1);
	 		
	 		// Gravando status Ocupada na nova vaga
	 		$vagaDestino->statusid = Status::Vaga_Ocupada;
    	 	$vagaDestino->ativa = TRUE;
    	 	$vagaDestino->salvar();
            
    	 	pg_query(conexao::Conectar(), 'commit');
    	 	
    	 	return $novoCandidatoVaga->getTableKeyValue();
        }
        catch (Exception $e) {
            pg_query(conexao::Conectar(), 'rollback');
            throw new Exception($e->getMessage());
        }
    }
    
    /**
     * Verifica o acesso aos botões
     * @param CandidatoVaga $operacao
     * @param $candidatoVaga
     * @param $throwExceptions
     * @return boolean
     */
    public static function isAuthorized($operacao, CandidatoVaga $candidatoVaga, $throwExceptions = FALSE)
    {
        $vaga     = $candidatoVaga->getVaga();
        $statusid = $candidatoVaga->getStatusAtual();
        $contrato = $vaga->getContrato();
        
        global $usuario, $pfcid;
        
        // Operação
        if (!$usuario->isAuthorized(Operacao::MOVIMENTACAO_PROMOCAO)) {
            if ($throwExceptions) {
                throw new Exception('Não é possível realizar esta operação, pois você precisa da operação Movimentação/Promoção.');
            }
            return FALSE;
        }
        
        if (!$contrato->podeMovimentarCandidatos()) {
            if ($throwExceptions) {
                throw new Exception('Não é possível realizar esta operação, pois o contrato não está confirmado.');
            }
            return FALSE;
        }
        
        if ($vaga->statusid != Status::Vaga_Ocupada) {
            if ($throwExceptions) {
                throw new Exception('Não é possível realizar esta operação, pois a vaga não está ocupada.');
            }
            return FALSE;
        }
        
        if (!$usuario->isVagaPermitida($vaga->vagaid)) {
            if ($throwExceptions) {
                throw new Exception('Não é possível realizar esta operação, pois você não tem acesso à esta vaga.');
            }
            return FALSE;
        }
        
        switch ($operacao) {
            case 'solicitar':
                if ($pfcid == PerfilComportamental::Gabinete && 
					$statusid == Status::Candidato_ContratacaoFinalizada) {
				    return TRUE;
				}
                break;
                
            case 'cancelar':
                if ($pfcid == PerfilComportamental::Gabinete && 
                    $statusid == Status::Candidato_PromocaoSolicitada) {
                    return TRUE;
                }
                break; 
                
            case 'encaminhar':
                if ($pfcid == PerfilComportamental::NucleoGestor && 
					$statusid == Status::Candidato_PromocaoSolicitada) {
				    return TRUE;
				}
                break;
                
            case 'confirmar':
                if ($pfcid == PerfilComportamental::Empresa && 
					$statusid == Status::Candidato_PromocaoEncaminhada) {
				    return TRUE;
				}
                break;
        }
        if ($throwExceptions) {
            throw new Exception(self::ERRO_AUTORIZACAO);
        }
        return FALSE;
    }
    
    /**
     * Status que geram alertas para os Perfis Comportamentais
     * @param $pfcid
     * @return array
     */
    public static function getAlertsStatus($pfcid)
    {
        switch ($pfcid) {
            case PerfilComportamental::Gabinete:
                break;
                
            case PerfilComportamental::NucleoGestor:
                return array(
                        Status::Candidato_PromocaoSolicitada, 
                        Status::Candidato_PromocaoEncaminhada);
                break;
                
            case PerfilComportamental::Orgao:
                break;
                
            case PerfilComportamental::Empresa:
                return array(Status::Candidato_PromocaoEncaminhada);
                break;
        }
    }
}